From 6174fcca46f50be04a48f02098cb049e94e455d3 Mon Sep 17 00:00:00 2001
From: Miqdad <ahmadmiqdad27@gmail.com>
Date: Mon, 29 Sep 2025 12:18:09 +0700
Subject: <miqdad>

---
 src-migrate/pages/shop/product/[slug].tsx | 62 +++++++++++++++----------------
 1 file changed, 29 insertions(+), 33 deletions(-)

(limited to 'src-migrate/pages/shop/product/[slug].tsx')

diff --git a/src-migrate/pages/shop/product/[slug].tsx b/src-migrate/pages/shop/product/[slug].tsx
index fc72a6b0..90658544 100644
--- a/src-migrate/pages/shop/product/[slug].tsx
+++ b/src-migrate/pages/shop/product/[slug].tsx
@@ -18,34 +18,41 @@ type PageProps = {
   product: IProductDetail
 }
 
-export const getServerSideProps: GetServerSideProps<PageProps> = (async (context) => {
-  const { slug } = context.query
+export const getServerSideProps: GetServerSideProps<PageProps & { canonicalPath: string }> = async (context) => {
+  const { slug } = context.query;
   const cookieString = context.req.headers.cookie;
   const cookies = cookieString ? cookie.parse(cookieString) : {};
   const auth = cookies?.auth ? JSON.parse(cookies.auth) : {};
-  const tier = auth?.pricelist || ''
+  const tier = auth?.pricelist || '';
 
-  const productId = getIdFromSlug(slug as string)
+  const productId = getIdFromSlug(slug as string);
+  const product = await getProductById(productId, tier);
 
-  const product = await getProductById(productId, tier)
+  // ❌ produk tidak ada → 404
+  if (!product) return { notFound: true };
 
-  if (!product) return { notFound: true }
+  // ❌ tidak ada variants atau tidak ada yang harga > 0 → 404
+  const hasValidVariant = Array.isArray(product.variants)
+    && product.variants.some(v => (v?.price?.price ?? 0) > 0);
+  if (!hasValidVariant) return { notFound: true };
+
+  // Canonical path aman untuk SSR (hindari router.asPath di server)
+  const canonicalPath = context.resolvedUrl || `/product/${slug}`;
+
+  return { props: { product, canonicalPath } };
+};
 
-  return {
-    props: { product }
-  }
-})
 
 const SELF_HOST = process.env.NEXT_PUBLIC_SELF_HOST
 
-const ProductDetailPage: NextPage<PageProps> = ({ product }) => {
+const ProductDetailPage: NextPage<PageProps & { canonicalPath: string }> = ({ product, canonicalPath }) => {
   const router = useRouter();
-
   const { setProduct } = useProductContext();
 
-  useEffect(() => {
-    if (product) setProduct(product);
-  }, [product, setProduct]);
+  useEffect(() => { if (product) setProduct(product); }, [product, setProduct]);
+
+  const origin = process.env.NEXT_PUBLIC_SELF_HOST || '';
+  const url = origin + (canonicalPath?.startsWith('/') ? canonicalPath : `/${canonicalPath}`);
 
   return (
     <BasicLayout>
@@ -53,31 +60,20 @@ const ProductDetailPage: NextPage<PageProps> = ({ product }) => {
         title={`${product.name} - Indoteknik.com`}
         description='Temukan pilihan produk B2B Industri &amp; Alat Teknik untuk Perusahaan, UMKM &amp; Pemerintah dengan lengkap, mudah dan transparan.'
         openGraph={{
-          url: SELF_HOST + router.asPath,
-          images: [
-            {
-              url: product?.image,
-              width: 800,
-              height: 800,
-              alt: product?.name,
-            },
-          ],
+          url,
+          images: [{ url: product?.image, width: 800, height: 800, alt: product?.name }],
           type: 'product',
         }}
-        additionalMetaTags={[
-          {
-            name: 'keywords',
-            content: `${product?.name}, Harga ${product?.name}, Beli ${product?.name}, Spesifikasi ${product?.name}`,
-          }
-        ]}
-        canonical={SELF_HOST + router.asPath}
+        additionalMetaTags={[{ name: 'keywords', content: `${product?.name}, Harga ${product?.name}, Beli ${product?.name}, Spesifikasi ${product?.name}` }]}
+        canonical={url}
       />
 
       <div className='md:container pt-4 md:pt-6'>
         <ProductDetail product={product} />
       </div>
     </BasicLayout>
-  )
-}
+  );
+};
+
 
 export default ProductDetailPage
\ No newline at end of file
-- 
cgit v1.2.3

